package com.blumov.fastbox.interfazPublica;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;

import com.blumov.fastbox.application.services.servicelocator.ServiceLocator;
import com.blumov.fastbox.application.services.servicelocator.ServiceLocatorImpl;
import com.blumov.fastbox.compra.PedidoDTO;
import com.blumov.fastbox.domain.model.compra.Pedido;
import com.blumov.fastbox.domain.model.compra.PedidoRepository;


/**
 * This implementation has additional support from the infrastructure, for
 * exposing as an RMI service and for keeping the OR-mapper unit-of-work open
 * during DTO assembly, analogous to the view rendering for web interfaces.
 * 
 * 
 * Accede a las capas de aplicacion y de dominio
 */
public class InterfazPublicaFacadeImpl implements InterfazPublicaFacade {

	private PedidoRepository pedidoRepository;

	private static Logger logger = Logger.getLogger(InterfazPublicaFacadeImpl.class);

	
	public InterfazPublicaFacadeImpl() {
		ServiceLocator serviceLocator = new ServiceLocatorImpl();
		this.pedidoRepository = serviceLocator.getPedidoRepository();
	}

	/**
	 * @see com.blumov.fastbox.interfazPublica.InterfazPublicaFacade#pedidosListos()
	 */
	public List<PedidoDTO> pedidosListos() {
		List<Pedido> pedidosListos = pedidoRepository.pedidosListos();
		return this.toDTO(pedidosListos);
	}
	
	/**
	 * @see com.blumov.fastbox.interfazPublica.InterfazPublicaFacade#pedidosPendientes()
	 */
	public List<PedidoDTO> pedidosPendientes() {
		List<Pedido> pedidosPendientes = pedidoRepository.pedidosPendientes();
		return this.toDTO(pedidosPendientes);
	}
	
	private List<PedidoDTO> toDTO(List<Pedido> pedidos) {
		List<PedidoDTO> pedidosDTO = new ArrayList<PedidoDTO>();
		
		for (Pedido pedido : pedidos) {
			PedidoDTO pedidoDTO = new PedidoDTO();
			pedidoDTO.setNumero(pedido.pedidoId().idString());
			pedidoDTO.setHoraCreacion(this.dateToString(pedido.getFechaCreacion()));
			pedidosDTO.add(pedidoDTO);
		}
		
		return pedidosDTO;
	}
	
	/**
	 * Transforma un DATE en un string con formato hh:mm:dd, con hh de 01 a 24 hs.
	 */
	private String dateToString(Date date) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("kk:mm:ss");
		return simpleDateFormat.format(date);
	}
}
